主にSoftDevice。
ボンディング時に渡される情報
-
master_id: 暗号化情報を識別するための情報ediv: 後に出てくるLTKが変わると変わるrand: これもLTKが変わると変わるが、edivがクライアントの内部でLTKへのKeyとして扱われているのに対してrandはその名の通り適当なランダムの値だと思われる
参照: https://stackoverflow.com/questions/48165520/need-details-about-ediv-and-rand
-
enc: ボンディングで保存されるべき暗号化情報ltk: Long Term Key。これがメインで用いられる暗号化のためのキーである。flags: 要調査。ボンディングすべきかなどのフラグを含んでいるらしい…?
つまり、
Map<(ediv, rand), ltk>のような構造となっていることがわかる。再接続する再には送られてきたmaster_idを用いてltkをストレージなどから読み出し、その値を暗号化に用いる。peer_id: クライアントを識別するための情報。暗号化とは違うaddr: いわゆるBluetoothのアドレスであるが、プライバシーのためにこのアドレスは接続の度に変化することが普通である。ではどうやってクライアイントを識別するのか。これが次のirkである。irk: Rustのnrf-softdeviceでは実際はこの値はprivateな値になっており、peer_idが同じものか判定するメソッドのみが提供されている。